package cn.mrcode.smartPluginSecurity.realm;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;

/**
 * @author zhuqiang
 * @version V1.0
 * @date 2015/11/16 21:15
 */
public class Md5CredentialsMatcher implements CredentialsMatcher {
    @Override
    public boolean doCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) {
        //未加密的密码
        String submitted = String.valueOf(((UsernamePasswordToken) authenticationToken).getPassword());
        //获取数据库中存储的密码，已通过MD5加密
        //这里需要注意的是：使用 subject.login 的时候，会第一次调用这个匹配器，获取的加密密码是char[]类型的。
        /*进入doGetAuthenticationInfo之后，由于我们使用用户名查询到数据库中的密码，并设置返回了。在这里set密码的时候，需要变成char类型
            不然的话，在这里就会因为两次强转的类型不一致抛出异常。
        */
        char[] arr = (char[])authenticationInfo.getCredentials();
        String encrypted = String.valueOf(arr);
        return DigestUtils.md5Hex(submitted).equalsIgnoreCase(encrypted); //提交的密码，和数据库查询出来的密码进行对比
    }
}
